﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.nowcoder.com/practice/e88b41dc6e764b2893bc4221777ffe64?tpId=308&tqId=40477&ru=/exam/oj

/*
题目描述：
给定一个
n
×
m
n×m的网格，在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物，放有障碍物的格子不能到达。求从
(
x
s
,
y
s
)
(x
s
​
 ,y
s
​
 )到
(
x
t
,
y
t
)
(x
t
​
 ,y
t
​
 )最少的移动次数。若不能到达，输出
−
1
−1。
输入描述：
第一行输入两个整数
n
,
m
n,m (
1
≤
n
,
m
≤
1000
1≤n,m≤1000)，表示网格大小。
第二行输入四个整数
x
s
,
y
s
,
x
t
,
y
t
x
s
​
 ,y
s
​
 ,x
t
​
 ,y
t
​
  (
1
≤
x
s
,
x
t
≤
n
1≤x
s
​
 ,x
t
​
 ≤n,
1
≤
y
s
,
y
t
≤
m
1≤y
s
​
 ,y
t
​
 ≤m)，表示起点和终点的坐标。
接下来的
n
n行，每行输入一个长度为
m
m的字符串。其中，第
i
i行第
j
j个字符表示第
i
i行第
j
j列的格子上的障碍物情况，若字符为'*'，则格子上有障碍物，若字符为'.'，则格子上没有障碍物。
保证起点不存在障碍物。
输出描述：
输出一行一个整数，表示从
(
x
s
,
y
s
)
(x
s
​
 ,y
s
​
 )到
(
x
t
,
y
t
)
(x
t
​
 ,y
t
​
 )最少的移动次数。
示例1
输入：
5 5
1 1 5 5
.....
****.
.....
**.**
.....
复制
输出：
12
复制
示例2
输入：
5 5
1 1 4 5
.....
****.
.....
**.**
.....
复制
输出：
-1
复制
示例3
输入：
5 5
1 1 5 5
.....
****.
.....
*****
.....
复制
输出：
-1

*/

// 开始解题：
// 方法——bfs
#include <iostream>
#include <queue>
using namespace std;
const int N = 1010;
char grid[N][N];
bool vis[N][N];
int n = 0, m = 0;
int bx = 0, by = 0, ex = 0, ey = 0;
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, -1, 0, 1 };

int bfs() {
    queue<pair<int, int>> q;
    q.push({ bx, by });
    vis[bx][by] = true;
    int step = 0;
    while (!q.empty()) {
        int size = q.size();
        step++;
        while (size--) {
            int curx = q.front().first;
            int cury = q.front().second;
            q.pop();
            for (int k = 0; k < 4; k++) {
                int x = curx + dx[k], y = cury + dy[k];
                if (x >= 1 && x <= n && y >= 1 && y <= m && grid[x][y] != '*' && !vis[x][y]) {
                    if (x == ex && y == ey) {
                        return step;
                    }
                    vis[x][y] = true;
                    q.push({ x, y });
                }
            }
        }
    }
    return -1;
}

int main() {
    scanf("%d%d", &n, &m);
    scanf("%d%d%d%d", &bx, &by, &ex, &ey);
    for (int i = 1; i <= n; i++) {
        scanf("%s", grid[i] + 1);
    }
    printf("%d\n", bfs());
    return 0;
}